enabled in script and no once uses "xm console" to read the console,
VMX boting will hang due to the buffer is full.
I added a "select" before "write". If it could not be written,
unix_write will Return immediately and it will not block the VMX
booting. With this fix, we can make VMX's serial enable by default.
Signed-off-by: Yu Ping <ping.y.yu@intel.com>
Modified to patch xmexample.hvm. Put through xenrt on a VMX box.
Signed-off-by: James Bulpin <james@xensource.com>
#-----------------------------------------------------------------------------
# serial port re-direct to pty deivce, /dev/pts/n
# then xm console or minicom can connect
-#serial='pty'
+serial='pty'
#----------------------------------------------------------------------------
# enable ne2000, default = 0(use pcnet)
static int unix_write(int fd, const uint8_t *buf, int len1)
{
- int ret, len;
+ int ret,sel_ret,len;
+ int max_fd;
+ fd_set writefds;
+ struct timeval timeout;
+
+ max_fd = fd;
len = len1;
while (len > 0) {
- ret = write(fd, buf, len);
- if (ret < 0) {
- if (errno != EINTR && errno != EAGAIN)
- return -1;
- } else if (ret == 0) {
- break;
- } else {
- buf += ret;
- len -= ret;
+ FD_ZERO(&writefds);
+ FD_SET(fd, &writefds);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 0;
+ sel_ret = select(max_fd + 1, NULL, &writefds, 0, &timeout);
+ if (sel_ret <= 0) {
+ /* Timeout or select error */
+ return -1;
+ } else {
+ ret = write(fd, buf, len);
+ if (ret < 0) {
+ if (errno != EINTR && errno != EAGAIN)
+ return -1;
+ } else if (ret == 0) {
+ break;
+ } else {
+ buf += ret;
+ len -= ret;
+ }
}
}
return len1 - len;